package com.zjw.socket.demo.starter.annotation.core;

import java.lang.annotation.*;


/**
 * 注解此Bean表示参与IOC过程，
 * 如果注解在类上，需空构造方法
 * <p>
 * 如果注释在构造器或者方法上，默认className为key，但此时可以填入参数name，
 * <p>
 * 如果重复注册同name的Bean，会忽略最新一次注册；
 * <p>
 * 如果构造器或者方法（此时的方法返回类型要是指定Class，否则抛出异常）有对应参数，
 * 在没有 @Inject 注解的情况下，会默认去容器中查询此类，若容器中没有注册，会检查@Bean注解，若没有此注解则抛出异常；
 * 如果参数类注解有
 *
 * @see Inject
 * 则根据
 * @see Inject#query() 字段去匹配，默认仍未class.getName为key
 */
@Target({ElementType.TYPE, ElementType.CONSTRUCTOR, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Bean {

  /**
   * 存储在ioc容器中的objectKey,
   * 默认:
   *
   * @see Class#getName()
   */
  String name() default "";

  /**
   * 可以指向接口或者父类，如果不是其实例，将抛出异常；
   */
  Class<?> type() default Object.class;
}
